package com.tedu.shoot;

import com.sun.xml.internal.ws.server.sei.TieHandler;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * Date：2021年09月
 * Author：程Sir
 * 微信公众号：程Sir小课堂
 * Content:
 *  飞行物的基类（超类、父类）
 */
public abstract class FlyingObject {
    // 适用于hero、sky、bullet
    public FlyingObject(int x, int y, int wdith, int height){
        this.wdith = wdith;
        this.height= height;
        this.x = x;
        this.y = y;
    }
    // 适用于bee、bigAirplane、airplane
    public FlyingObject(int wdith, int height){
        this.wdith = wdith;
        this.height= height;
        this.x = (int)(Math.random()*(World.WIDTH-this.wdith));
//        this.y = -this.height;
        // 如果要测试飞行物是否产生，则需要将出生的位置设置在界面里面，为了可视化，那么x和 y都得是正数
        this.y = -this.height;
    }

    //声明的第一种状态：活着的
    public static final int LIVE = 0;
    //声明的第一种状态：死了的
    public static final int DEAD = 1;
    //声明的第一种状态：可移除状态【指的是从飞行物移除】
    public static final int REMOVE = 2;
    // 表示游戏中飞行物的状态
    public int state = LIVE;


    // 宽高表示大小
    public int wdith;
    public int height;
    // 位置
    public int x;
    public int y;
    /*
     * 飞行物获取图片
     */
    public abstract BufferedImage getImage();

    /**
     * 飞行物的移动
     */
    public abstract void step();

    /**
     * 判断是否出界的方法
     * @return 如果判断出界，返回true，否则返回false
     */
    public abstract boolean isOutBound();

    /**
     * 画飞行物的方法
     * @param g 表示画笔
     */
    public void paint(Graphics g){
        g.drawImage(this.getImage(),this.x,this.y,null);
    }

    /**
     * 判断飞行物间是否发生了碰撞
     * @param other 另外一个飞行物
     * @return 如果发生碰撞，返回true,否则返回false
     */
    public boolean isHit(FlyingObject other){
        int x1 = this.x - other.wdith;
        int y1 = this.y - other.height;
        int x2 = this.x + this.wdith;
        int y2 = this.y + this.height;
        // 发生碰撞的条件
        if( other.x > x1 && other.x < x2
            &&
           other.y > y1 && other.y < y2
        ){
            return true;
        }
        return false;
    }


    // 改变飞行物的状态，设置为Dead
    public void goDead(){
        this.state = DEAD;
    }

    // 判断飞行物的状态是活着的
    public boolean isLive(){
        return this.state == LIVE;
    }

    // 判断飞行物的状态是移除状态
    public boolean isRemove(){
        return this.state == REMOVE;
    }

}
